package ru.averta.notes.service.interceptor;

import org.hibernate.CallbackException;
import org.hibernate.EmptyInterceptor;
import org.hibernate.type.Type;
import ru.averta.notes.domain.Site;
import ru.averta.notes.domain.Tag;
import ru.averta.notes.service.CoolMarkService;
import ru.averta.notes.service.tag.TagManager;

import java.io.Serializable;
import java.util.Collection;

public class SiteDeleteInterceptor extends EmptyInterceptor {

    //Загружает tagInterceptorLoader - http://samolisov.blogspot.com/2008/10/hibernate-interceptor-spring.html
    private TagManager tm;
    private CoolMarkService markService;

    /**
     * Если удаляется сайт, то так же удаляем смежные объекты (теги, оценки, комменты и т.д.)
     *
     * @param entity
     * @param id
     * @param state
     * @param propertyNames
     * @param types
     * @throws CallbackException
     */
    public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) throws CallbackException {

        if (entity instanceof Site) {
            Site site = (Site) entity;

            removeTags(site);
            removeMarks(site);
        }
    }

    /**
     * Удаляем от отвязываемого сайта теги
     * @param site
     */
    private void removeTags(Site site) {
        Collection<Tag> tags = tm.getTagsForObject(site);
        for (Tag tag : tags) {
            tm.removeTag(site, tag);
        }
    }

    /**
     * Удаляем от отвязываемого сайта оценки
     * @param site
     */
    private void removeMarks(Site site) {
        /*Collection<CoolMark> siteMarks = site.getMarks();
        Collection<CoolMark> marks = UtilsCommon.collectionToRemove(siteMarks);
        for (CoolMark mark : marks) {
            siteMarks.remove(mark);
            markDao.remove(mark);
        }*/

        markService.removeAllMarksForSite(site);
    }

    public void setTagManager(TagManager tm) {
        this.tm = tm;
    }

    public void setMarkService(CoolMarkService markService) {
        this.markService = markService;
    }

    private Site getTagable(Object entity) {
        if (entity instanceof Site) {
            return (Site) entity;
        } else {
            return null;
        }
    }
}
